package com.zp.pattern.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Client {
	public static void main(String[] args) {
		RealSubject realSubject = new RealSubject();
		InvocationHandler handler = new DynamicProxy(realSubject);
		
		System.out.println(handler instanceof DynamicProxy);
		
		Class<?> classType = handler.getClass();
		
		System.out.println("class====="+classType);
		
		/**
		 * 下面代码一次性生成代理：
		 * a)Proxy类生成代理实例：接收真实角色的的动态代理对象的class对象，再调用类加载器方法；
		 * b)真实角色的class对象的所有接口数组，此处就实现了一个接口：Suject；
		 * c)handler：动态代理；
		 * 为什么要强制转换成suject类型：实现接口编程，调用request()方法；
		 * 实现了什么接口就可以转化成什么接口类型；
		 * 例如：可以把该class的实例当作这些interface中的任何一个来用
		 * public class Test implements A,B,C{
		 * 		public static void main(String[] args){
		 * 			A a = new Test();
		 * 			B b = new Test();
		 * 			C c = new Test();
		 * 		}
		 * }
		 */
		
		//生成的代理对象是：$Proxy0，见下面打印结果；
		//下面这个相当于静态代理的Porxy类，会在方法中实现的接口：realSubject.getClass().getInterfaces()；
		Subject subject = (Subject)Proxy.newProxyInstance(classType.getClassLoader(),
				realSubject.getClass().getInterfaces(),handler);
		
		
		//当执行该方法时，则会找到上面的handler里面的invoke方法(即DynamicProxy类中的invoke方法)
		subject.request();
		
		//结果：class $Proxy0，这个是在运行期间动态的生成的代理对象，并且实现了realSubject实现的接口；
		System.out.println(subject.getClass());
	}
}
